package 设计二构造版本2;

import java.util.Random;

/**
 * 算式抽象类，定义算式的基本属性和方法
 */
public abstract class fermula {
    protected int leftOperand;    // 左操作数
    protected int rightOperand;   // 右操作数
    protected char operator;      // 运算符
    protected int result;         // 运算结果
    
    /**
     * 获取左操作数
     * @return 左操作数
     */
    public int getLeftOperand() {
        return leftOperand;
    }
    
    /**
     * 获取右操作数
     * @return 右操作数
     */
    public int getRightOperand() {
        return rightOperand;
    }
    
    /**
     * 获取运算符
     * @return 运算符
     */
    public char getOperator() {
        return operator;
    }
    
    /**
     * 获取运算结果
     * @return 运算结果
     */
    public int getResult() {
        return result;
    }
    
    /**
     * 设置左操作数
     * @param leftOperand 左操作数
     */
    protected void setLeftOperand(int leftOperand) {
        this.leftOperand = leftOperand;
    }
    
    /**
     * 设置右操作数
     * @param rightOperand 右操作数
     */
    protected void setRightOperand(int rightOperand) {
        this.rightOperand = rightOperand;
    }
    
    /**
     * 设置运算符
     * @param operator 运算符
     */
    protected void setOperator(char operator) {
        this.operator = operator;
    }
    
    /**
     * 设置运算结果
     * @param result 运算结果
     */
    protected void setResult(int result) {
        this.result = result;
    }
    
    /**
     * 生成随机算式的抽象方法
     * @param random 随机数生成器
     */
    public abstract void generate(Random random);
    
    /**
     * 计算结果的抽象方法
     */
    protected abstract void calculate();
    
    /**
     * 返回算式的字符串表示
     * @return 算式的字符串表示
     */
    @Override
    public String toString() {
        return leftOperand + " " + operator + " " + rightOperand + " = " + result;
    }
    
    /**
     * 判断两个算式是否相等
     * @param obj 要比较的对象
     * @return 如果相等返回true，否则返回false
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        fermula other = (fermula) obj;
        return leftOperand == other.leftOperand &&
               rightOperand == other.rightOperand &&
               operator == other.operator;
    }
    
    /**
     * 计算哈希码
     * @return 哈希码
     */
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + leftOperand;
        result = 31 * result + rightOperand;
        result = 31 * result + operator;
        return result;
    }
}